iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
WordPress

從 0 到 100:WordPress 開發者的實戰手冊系列 第 7

Day 7 - 詳解 WordPress 的資料庫架構

  • 分享至 

  • xImage
  •  

如果你是按照筆者在第二篇文章介紹的 XAMPP 來建立開發環境,那麼輸入網址 http://127.0.0.1/phpmyadmin 到瀏覽器的網址列,會進到 XAMPP 預裝的資料庫管理工具,phpMyAdmin。

phpMyAdmin 畫面
圖:phpMyAdmin 畫面

點選進到資料庫,會發現剛安裝完 WordPress 時,資料庫內會有 12 張資料表,這些是 WordPress 安裝程式自動建立的預設資料表。

資料表介紹

接下來我們一起來看看,這些資料表有什麼用途。

資料表名稱 用途
wp_posts 所有的文章、頁面和修訂版本等內容資訊。
wp_postmeta 文章或頁面相關的自訂欄位資訊。
wp_comments 網站上的迴響。
wp_commentmeta 與迴響相關的自訂欄位資訊。
wp_terms 分類、標籤和其他自訂分類法。
wp_termmeta 與分類相關的自訂欄位資訊。
wp_term_relationships 將文章、頁面和分類、標籤建立關聯。
wp_term_taxonomy 定義了分類、標籤和其他自訂分類之間關聯,包含上下層的從屬關係。
wp_users 網站上的所有用戶資訊。
wp_usermeta 與用戶相關的自訂欄位資訊。
wp_links 舊版本的 WordPress 才有使用,拿來放網站連結和書籤。新版本的WordPress 並無使用。
wp_options 網站的設定選項,如網站名稱、描述、啟用的外掛、佈景主題的設定等等。

其中 wp_links 是向下相容版本,已經沒有在使用了。

其它 11 個資料表都非常重要,而且許多重要的外掛都使用到這些基本的資料表,作更進一步的延伸功能。

資料表結構說明

wp_posts

欄位名稱 資料型態 屬性 說明
ID bigint(20) UN、AI、PK 文章 ID
post_author bigint(20) UN 作者 ID
post_date datetime 建立的日期和時刻
post_date_gmt datetime 建立的格林威治時間
post_content longtext 主要部分
post_title text 標題
post_excerpt text 摘要
post_status varchar(20) 發布狀態,如 publisheddraft
comment_status varchar(20) 是否允許迴響
ping_status varchar(20) 是否允許 pingbackstrackbacks
post_password varchar(255) 查看內容是否需要密碼
post_name varchar(200) 文章網址
to_ping text 要通知的網址列表
pinged text 已經通知的網址列表
post_modified datetime 最後修改的日期和時刻
post_modified_gmt datetime 最後修改的格林威治時間
post_content_filtered longtext 一些外掛用來存放過濾後的內容
post_parent bigint(20) UN 如果內容是子內容,存放其父 ID
guid varchar(255) 通常用於 RSS feed
menu_order int(11) 選單中的排序
post_type varchar(20) 內容類型,例如 postpage
post_mime_type varchar(100) 如果內容是附件,存放其 MIME 類型
comment_count bigint(20) 迴響數量

這個資料表是 WordPress 中最重要的資料表,幾乎所有的內容相關操作都與這個資料表有關,只是利用了不同的 post_type 來增加新的資料種類,例如 WooCommerce 用 shop_order 這個 post_type 來存放訂單資料。

wp_postmeta

欄位名稱 資料型態 屬性 說明
meta_id bigint(20) UN AI PK 元資料 ID
post_id bigint(20) UN wp_posts 表中的 ID 欄位相關聯
meta_key varchar(255)
meta_value longtext

開發者可以利用這個資料表擴充 wp_posts 相關聯的文章,提供與 wp_posts 資料表中的內容相關的額外資訊。

透過這個資料表,WordPress 提供了一個非常靈活的方式,讓使用者及開發者擴展內容的功能和屬性,使其可以存放更多的資訊。例如 WooCommerce 使用它來存放訂單的詳細資料,例如訂購人的姓名、地址、電話、等等。

wp_comments

欄位名稱 資料型態 屬性 說明
comment_ID bigint(20) UN、AI、PK 迴響 ID
comment_post_ID bigint(20) UN 迴響所屬的文章或頁面的 ID
comment_author tinytext 進行迴響的作者的名稱
comment_author_email varchar(100) 作者的電子郵件地址
comment_author_url varchar(200) 作者的網站網址
comment_author_IP varchar(100) 作者的 IP 地址
comment_date datetime 本地時區的迴響日期和時間
comment_date_gmt datetime 格林威治標準時 (GMT) 的迴響日期和時間
comment_content text 迴響的內容
comment_karma int(11) 迴響的讚數 (通常用於某些外掛中)
comment_approved varchar(20) 迴響的狀態,如 1 表示批准,0 表示等待審核,spam 表示垃圾迴響等。
comment_agent varchar(255) 用戶的瀏覽器信息
comment_type varchar(20) 迴響的類型,如 commentpingbacktrackback
comment_parent bigint(20) UN 如果這是一個回覆,此欄位將儲存被回覆的迴響 ID
user_id bigint(20) UN 如果迴響者是網站的註冊用戶,此欄位將儲存其用戶ID

此資料表用於存放 WordPress 網站上的所有迴響。不僅僅是文章和頁面的迴響而已,還包括像是 trackbackspingbacks 這樣的資料。WooCommerce 也用它來存放消費者留的訂單備註。

wp_commentmeta

欄位名稱 資料型態 屬性 說明
meta_id bigint(20) UN、AI、PK 元資訊 ID
comment_id bigint(20) UN 與該元資訊相關的迴響 ID
meta_key varchar(255)
meta_value longtext

這個資料表存放與迴響相關的額外資訊。作用與 wp_postmetawp_usermeta 類似。通過這個資料表,你可以為迴響添加額外的自定義欄位。

wp_terms

欄位名稱 資料型態 屬性 說明
term_id bigint(20) UN、AI、PK 字詞 ID
name varchar(200) 字詞的名稱
slug varchar(200) 用於網址的字串
term_group bigint(10) 用於字詞的同義詞功能

這個資料表存放 WordPress 中的字詞。字詞可以是分類、標籤或其他自定義的分類法的項目。

wp_termmeta

欄位名稱 資料型態 屬性 說明
meta_id bigint(20) UN、AI、PK 元資訊 ID
term_id bigint(20) UN 與字詞資料表 wp_terms 相關聯的 ID
meta_key varchar(255)
meta_value longtext

這個資料表存放與字詞相關的額外資訊。與 wp_postmetawp_commentmetawp_usermeta 類似。

wp_term_relationships

欄位名稱 資料型態 屬性 說明
object_id bigint(20) UN、PK 對象的ID,例如文章的 ID
term_taxonomy_id bigint(20) UN、PK 與字詞分類法 wp_term_taxonomy 資料表相關聯的 ID
term_order int(11) 字詞的排序

這個資料表描述目標對象,以文章來說,就是文章和字詞之間的關係,例如文章屬於哪個分類或標籤。

wp_term_taxonomy

欄位名稱 資料型態 屬性 說明
term_taxonomy_id bigint(20) UN、AI、PK 字詞分類法 ID
term_id bigint(20) UN 與字詞資料表 wp_terms 相關聯的 ID
taxonomy varchar(32) 分類法的名稱, 例如 category
description longtext 字詞的描述
parent bigint(20) UN 父字詞的ID,用於分類的層次結構
count bigint(20) 使用該字詞的對象數量

這個資料表定義字詞屬於哪個分類法,例如分類、標籤、等等。

wp_users

欄位名稱 資料型態 屬性 說明
ID bigint(20) UN、AI、PK 使用者 ID
user_login varchar(60) 使用者登入名稱
user_pass varchar(255) 使用者密碼 (加密)
user_nicename varchar(50) 用於 URL 的使用者名稱
user_email varchar(100) 的電子郵件地址
user_url varchar(100) 的網站 URL
user_registered datetime 註冊日期和時間
user_activation_key varchar(255) 用於帳戶啟用的金鑰
user_status int(11) 使用者的狀態
display_name varchar(250) 顯示在網站上的使用者名字

用於存放 WordPress 網站上的所有使用者的基本資料,包括使用者的登入名稱、密碼、電子郵件等。每個使用者在此資料表都有一個唯一的 ID,其他的資料表可以參照這個 ID 來存取特定使用者的資訊。

wp_usermeta

欄位名稱 資料型態 屬性 說明
umeta_id bigint(20) UN、AI、PK 元資訊 ID
user_id bigint(20) UN 和資料表 wp_users 相關聯的 ID
meta_key varchar(255)
meta_value longtext

存放使用者的額外資訊,這些資訊可能不是每個使用者都需要的,例如使用者的頭像、自我介紹等。這個資料表與 wp_users 相關聯,通過 user_id 欄位來確定資料的所有者。

wp_links

欄位名稱 資料型態 屬性 說明
link_id bigint(20) UN、AI、PK 連結 ID
link_url varchar(255) 連結的 URL 地址
link_name varchar(255) 連結的名稱
link_image varchar(255) 連結的圖像 URL
link_target varchar(25) 定義如何打開連結,例如:新視窗
link_description varchar(255) 連結的描述
link_visible varchar(20) 連結是否可見
link_owner bigint(20) UN 連結的所有者的使用者 ID
link_rating int(11) 連結的評分
link_updated datetime 最後一次更新連結的時間
link_rel varchar(255) 連結的 rel 屬性值
link_notes mediumtext 關於連結的註釋
link_rss varchar(255) 連結的 RSS 地址

用於存放和管理在 WordPress 網站上的外部連結。這個功能在新版的 WordPress 已不使用,用來向下相容早期的版本中,用於管理友情連結。

wp_options

欄位名稱 資料型態 屬性 說明
option_id bigint(20) UN、AI、PK 選項 ID
option_name varchar(191) 選項名稱
option_value longtext 選項值

這個資料表是 WordPress 中非常重要的一部分,它存放了網站的所有設定和選項,例如網站的名稱、描述、URL、以及許多外掛和佈景主題的設定。當你在 WordPress 後台更新設定時,這些新的設定值會被儲存到這個資料表中。

註:

  • 「term」這一個字,筆者將它翻譯為「字詞」,感覺比較貼近這個情境,可以設定任何的字詞,把它拿來作為分類、標籤等等。
  • 「meta」這一個字是額外資訊,不過很多媒體將它翻譯為「元」,因此本文把它稱為「元資訊」。如果有更好的翻譯,歡迎交流。

資料表關聯

WordPress 資料庫關聯
圖:WordPress 資料表關聯圖

筆者繪製了一個簡易的關聯圖幫助大家理解,以下為每張資料表的結構及說明。大致上可分為四類:文章、使用者、字詞分類以及迴響。

總結

基礎的資料表就這 11 + 1 個,但隨著啟用的外掛越來越多,其它外掛自行建立的資料表,混在資料庫中,或許會讓你搞不清楚,那些資料表是原始的、最重要的,所以認識這些資料表,無論是否為程式開發者,或只是一般的部落客,對於日後自己維護 WordPress 站台,是非常有幫助的哦!

WordPress 提供了這些資料表,要如何使用它們,不用太擔心需要自己設計 SQL 語法來呼叫。已經有許多內建的函式可以直接新增、刪除、修改它們,除非是基於最佳化查詢語句的理由,不然幾乎用不太到自己寫 SQL 語法的部分。


課後思考:

有的外掛在停用或移除後,沒做垃圾回收,自動將所建立資料表和 wp_options 內的設定值刪除,因此資料庫裡越來越多不認識的東西,你會主動把它們刪除嗎?

前篇解答參考:

註冊函式到鉤點和過濾器內,每到達一個鉤點被觸發的時候,PHP 都是迴圈,依照優先級來執行它門。而 WordPress 的外掛系統都是採用鉤點來控制功能,因此外掛越多,整體的迴圈數也會越多,除了有效能的問題,還會有記憶體累積的問題。因此要達成為「No Code」的境界又要管理好 WordPress 網站,也是相當了不起的唷。


上一篇
Day 6 - WordPress 高擴充性的機制 - 鉤點 (Hook) 及過濾器 (Filter)
下一篇
Day 8 - 佈景主題設計的路線 - 傳統還是區塊?
系列文
從 0 到 100:WordPress 開發者的實戰手冊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言